package me.sealer.utils;

/**
 * @author sealer
 * @date 2017/11/23.
 */

import java.io.*;

public class SerializationUtil {

    /**
     * 通过java内置的序列化方式将实现Serializable接口的类对象序列化为字节数组
     *
     * @param t   需要被序列化的对象
     * @param <T> 参数t的泛型类型
     * @return 序列化后的字节数组
     */
    public static <T extends Serializable> byte[] serialize(T t) throws IOException {
        // 定义一个字节数组输出流
        ByteArrayOutputStream baos = new ByteArrayOutputStream();

        // 定义一个对象输出流
        ObjectOutputStream oos = new ObjectOutputStream(baos);

        // 将对象写入到字节数组输出，进行序列化
        oos.writeObject(t);

        // ？？？
        oos.flush();

        // close
        oos.close();

        // 获取返回字节数组
        byte[] bytes = baos.toByteArray();

        // ？？？
        baos.flush();

        // 关闭
        baos.close();

        //将序列化后的字节数组返回
        return bytes;
    }

    /**
     * 通过java内置的反序列化方式将字节数组反序列化为实现Serializable接口的类对象
     *
     * @param bytes 序列化后的字节数组
     * @param <T>   需要反序列化为的对象类型
     * @return 反序列化的T类的对象
     */
    public static <T extends Serializable> T deserialize(byte[] bytes) throws IOException, ClassNotFoundException {
        // 定义一个字节数组输入流
        ByteArrayInputStream bais = new ByteArrayInputStream(bytes);

        //定义一个对象输入流
        ObjectInputStream ois = new ObjectInputStream(bais);

        // 读取对象
        T t = (T) ois.readObject();

        // close
        ois.close();

        // close
        bais.close();

        // 返回反序列化后的T类的对象
        return t;
    }

}
